import cv2
import numpy as np

# 载入视频文件
cap = cv2.VideoCapture('bike.mp4')

while True:
    # 读取一帧图像
    ret, frame = cap.read()

    # 如果没有读取到帧则退出循环
    if not ret:
        break

    # 灰度影像
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将原始图像转换为灰度图像

    # 显示灰度影像
    cv2.imshow('frame', gray_frame)

    # 原始振幅谱
    fft = np.fft.fft2(gray_frame)  # 计算原始图像的二维傅里叶变换
    mag_spectrum = np.abs(fft)  # 计算原始振幅谱
    mag_spectrum = np.log(mag_spectrum)  # 将振幅谱转换为对数刻度，以便更好地可视化

    # 显示原始振幅谱
    norm_mag_spectrum = cv2.normalize(mag_spectrum, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    cv2.imshow('mg_spc', norm_mag_spectrum)

    # 平移后振幅谱
    fft_shift = np.fft.fftshift(fft)  # 平移原始傅里叶变换以使低频部分在图像中心
    mag_spectrum_shift = np.abs(fft_shift)  # 计算平移后的振幅谱
    mag_spectrum_shift = np.log(mag_spectrum_shift)  # 将平移后的振幅谱转换为对数刻度，以便更好地可视化

    # 显示平移后的振幅谱
    norm_mag_spectrum_shift = cv2.normalize(mag_spectrum_shift, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    cv2.imshow('mg_spc_shift', norm_mag_spectrum_shift)

    # 等待按键事件或一定的时间，然后关闭所有窗口
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

# 释放视频文件
cap.release()

# 关闭所有窗口
cv2.destroyAllWindows()